package com.study.hisapi.utils;

import javax.validation.*;
import java.util.Set;

public class ValidatedUtils {

    private static final ValidatorFactory VALIDATOR_FACTORY = Validation.buildDefaultValidatorFactory();
    private static final Validator VALIDATOR = VALIDATOR_FACTORY.getValidator();

    /**
     * 静态工具类，禁止外部实例化。
     */
    private ValidatedUtils() {
    }

    /**
     * 验证单个对象的属性是否符合约束注解（如 @NotNull, @Size, @Min, 等）。
     *
     * @param object 待验证的对象
     * @param groups 验证组列表，指定需要应用的验证规则集
     * @param <T>    待验证对象的类型
     * @return 验证结果集，包含所有违反约束的错误信息
     */
    public static <T> Set<ConstraintViolation<T>> validate(T object, Class<?>... groups) {
        return VALIDATOR.validate(object, groups);
    }

    /**
     * 验证单个对象的某个属性是否符合约束注解（如 @NotNull, @Size, @Min, 等）。
     *
     * @param object       待验证的对象
     * @param propertyName 待验证的属性名
     * @param groups       验证组列表，指定需要应用的验证规则集
     * @param <T>          待验证对象的类型
     * @return 针对指定属性的验证结果集，包含所有违反约束的错误信息
     */
    public static <T> Set<ConstraintViolation<T>> validateProperty(T object, String propertyName, Class<?>... groups) {
        return VALIDATOR.validateProperty(object, propertyName, groups);
    }

    /**
     * 判断给定对象的属性是否全部符合约束注解（按指定的验证组）。
     *
     * @param object 待验证的对象
     * @param groups 验证组列表，指定需要应用的验证规则集
     * @param <T>    待验证对象的类型
     * @return 若全部属性验证通过，返回 true；否则返回 false
     */
    public static <T> Set<ConstraintViolation<T>> isValid(T object, Class<?>... groups) {
        return validate(object, groups);
    }

    /**
     * 根据分组序列（GroupSequence）验证对象。
     *
     * @param object        待验证的对象
     * @param groupSequence 分组序列类，定义了验证的顺序和条件
     * @param <T>           待验证对象的类型
     * @return 验证结果集，包含所有违反约束的错误信息
     */
    public static <T> Set<ConstraintViolation<T>> validateWithGroupSequence(T object, Class<? extends GroupSequence> groupSequence) {
        return VALIDATOR.validate(object, groupSequence);
    }
}
